\chapter{\nomproj}\label{ch:sujet}

\section{Objectifs}

L'objectif de \nomproj est de simplifier la chaine de réalisation de création d'indicateurs, depuis l'étape d'import de fichier de log jusqu'à leur intégration dans la base de données et leur affichage sous forme de rapport.

Dans son état initial, l'ensemble des configuration de PRISME est réalisé par 3 fichiers disponibles en annexes :
\begin{itemize}
	\item \textit{grabber.conf} : fichier de configuration directement lisible via bash (annexe \ref{grab_example})
	\item \textit{loader.xml} : XML aux balises spécifiques au moteur loader de PRISME (annexe \ref{load_example})
	\item \textit{report.xml} : XML aux balises spécifiques au moteur report de PRISME (annexe \ref{report_example})
\end{itemize}
Ceux-ci doivent être édité à la main et ne peuvent être testé qu'en faisant des appels manuels au système tout en allant vérifier les différents éléments affectés en ligne de commande.

Nous cherchons donc à proposer une solution qui soit indépendante de la machine de travail, facilite les vérifications,\ldots tout en offrant une rétrocompatibilité par rapport aux fichiers déjà réalisés.

\section{Environnement de développement}

L'environnement de développement de \nomproj est le même que celui de PRISME. Néanmoins, voici la liste exhaustive des éléments caractérisant le développement du projet \nomproj.

\begin{itemize}

\item \emph{Java} : Java 1.5
\item \emph{IDE} : Eclipse Java EE, Version: Indigo Service Release 2
\item \emph{Serveur web} : Apache Tomcat 5.5
\item \emph{navigateur} : Mozilla Firefox version 14 lié à Firebug 1.10.2 (au 23 août 2012)
\item \emph{framework} : Apache Struts 2.0, architecture MVC.

\end{itemize}

\subsection{Java}

Le développement côté serveur a été réalisé dans le célèbre language orienté objet, étudié tout au long de notre formation à l'INSA : Java. Grâce à ses servlets et ses JavasServer Pages (JSP), Java s'est imposé auprès de nombreuses entreprises pour réaliser des applications client-serveur importantes pouvant ainsi se substituer aux solutions internet classiques. La version 1.5 de Java, utilisée durant ce stage, est sortie en septembre 2004.

\subsection{Eclipse}

Celèbre environnement de développement intégré (IDE), Eclipse est un projet de la Fondation Eclipse qui se veut libre, extensible, universel et polyvalent. Son objectif est de produire et fournir divers outils gravitant autour de la réalisation de logiciel, englobant les activités de codage logiciel proprement dites (avec notamment un environnement de développement intégré) mais aussi de modélisation, de conception, de test, de reporting, etc. Son environnement de développement notamment vise à la généricité pour lui permettre de supporter n'importe quel langage de programmation.

La version Indigo, avec laquelle j'ai travaillé, date de Juin 2011. On notera que la dernière version Juno créée quelque soucis autour de la configuration des fichiers de configuration des projets.

\subsection{Apache Tomcat}

Le logiciel libre Apache HTTP Server (Apache) est un serveur HTTP créé et maintenu au sein de la fondation Apache. C'est le serveur HTTP le plus populaire au sein d'Internet. Il est distribué selon les termes de la licence Apache.

Tomcat, quant à lui, est un conteneur libre de servlets et JSP Java EE. Issu du projet Jakarta, c'est un projet principal de la fondation Apache. Il implémente les spécifications des servlets et des JSP du Java Community Process, est paramétrable par des fichiers XML et de propriétés, et inclut des outils pour la configuration et la gestion.

\subsection{Apache Struts 2.0}

Apache Struts~\cite{strutsBib} est un framework libre servant au développement d'applications web J2EE. Il utilise et étend l'API Servlet Java afin d'encourager les développeurs à adopter l'architecture Modèle-Vue-Contrôleur. Apache Struts a été créé par Craig McClanahan et donné à la fondation Apache en mai 2000. Struts a fait partie du projet Jakarta de mai 2000 jusqu'en mars 2004.

Cette infrastructure permet la conception et l'implémentation d'applications Web de taille importante par différents groupes de personnes. En d'autres termes, les designers, développeurs de composants logiciels peuvent gérer leur propre part du projet de manière découplée.
Struts permet la structuration d'une application Java sous forme d'un ensemble d'actions représentant des événements déclenchés par les utilisateurs de l'application. Ces actions sont décrites dans un fichier de configuration de type XML décrivant les cheminements possibles entre les différentes actions. 

En plus de cela, Struts permet d'automatiser la gestion de certains aspects comme la validation des données entrées par les utilisateurs via l'interface de l'application. Plus besoin de venir coder le contrôle de chaque donnée fournie par un utilisateur, il suffit de décrire les vérifications à effectuer dans un fichier XML dédié à cette tâche.

Néanmoins, il serait inadapté d'utiliser ce framework dans des projets de petite taille car il introduit une certaine complexité. Struts montre toute sa puissance dans des applications d'une certaine envergure.
Struts est un logiciel libre distribué selon les termes de la licence Apache.

\section{Une application structuré par Struts 2}

Le framework Struts 2.0~\cite{strutsBib} assure le fonctionnement de l'ensemble du portail web PRISME actuel. On souhaite rendre la création et la gestion de nos indicateurs disponible depuis un maximum de poste et ce de la manière la plus simple possible : une application internet riche (RIA)  permet de remplir ces différents points. 
Pour se faire un nouveau portail de configuration, \nomproj, a été mis en place sur la même plateforme. De ce fait, le framework Struts 2.0 structure également notre projet \nomproj.

Le framework Struts fonctionne autour du modèle MVC, les actions que l'on souhaite réaliser doivent passer par le contrôleur et donc hériter de la classe \textit{Action} fourni par Struts. Néanmoins, un certain nombre de fonction et service doivent être assurés pour l'ensemble de nos actions, l'héritage de \textit{Action} est donc réalisé par \textit{BaseAction}. Elle assure ainsi les services de connexion à la base de données et de lecture du fichier de configuration \textit{global.properties}.

Le diagramme \ref{actionUml} montre les diverses classes d'action définies. Celle-ci réponde à nos 3 services, et à leurs deux types d'action : les classes d'action de chargement de page, et les classes d'action d'appel dynamique Ajax. Toutes les classes étudiées dans ce rapport ont un lien immédiat avec ce diagramme.

\begin{figure}
\centering
\includegraphics[scale=0.7]{../img/archiStruts2.jpg}
\caption{Comportement MVC Struts 2.0}
\label{archiStruts}
\end{figure}

\chapter{Grabber}\label{ch:grabChapter}

L’objectif du Grabber Editor est de simplifier la création et le controle de l’import de fichier de log dans notre système PRISME. L’application est découpé en 2 phases où l'utilisateur va remplir des formulaires assistés. La première va nous permettre de spécifier la cible, la seconde les paramètres de récupération qui lui sont affectés comme on peut le voir dans l'exemple (annexe \ref{grab_example}). L'utilisateur fournit l'ensemble des valeurs pour les clefs de manière classique et poste le formulaire au fur et à mesure. L'ensemble des classes utilisées est présenté dans le diagramme \ref{grabUml}. On va donc guider l'utilisateur en lui spécifiant les champs à remplir obligatoirement, ceux accessoires ou encore ceux dont une sélection depuis une base de donnée est possible.

\section{WizardAction}

\textit{WizardAction} est la classe centrale de notre application Grabber. Elle concentre les différentes fonctions liées aux éléments non dynamique de notre page tel que la liste des fichiers de grabber déjà existants, initialiser la liste des modèles de récupération,\ldots

Elle permet aussi de sauvegarder notre objet courant grabber au travers des différentes pages qui compose l'assistant. Celui-ci est sauvegarder au sein de la pile des variables de sessions entièrement gérée par Struts. A noter, de ce fait ouvrir plusieurs onglets de notre application amène certains comportements non-intuitifs et est donc vivement déconseillé.

\textit{WizardAction} implémente également la gestion des tables \textit{dim\_\_pfs}, \textit{dim\_\_srv\_type} et \textit{dim\_\_srv}. L'objectif de ces tables est de référencer l'ensemble des serveurs utilisés pour pouvoir faire des propositions à l'utilisateur. Ces tables sont remplies lorsque l'utilisateur remplit les textbox correspondantes au lieu de sélectionner un élément existant de la liste. On vérifie simplement s'il s'agit d'une nouvelle entrée.
L'objet \textit{SqlManager} gère justement l'ensemble de ces 3 tables, en lecture et écriture, grâce aux méthodes de PreparedStatement de Java.

\section{Mode d'extraction}

Les modes d'extraction permettent de spécifier des méthodes d'accès aux fichiers de logs différentes, les 2 principaux (qui ont été implémentés) sont \textit{ScheduledMode} (une récupération par jour) et \textit{RealTimeMode} (une récupération toutes les $x$ minutes). En fonction de chaque mode, les paramètres varient, l'ensemble des méthodes doit donc être implémentés dans cet objectif.

La possibilité est offerte de rajouter un nouveau mode d'extraction. En effet, si le reste des informations du document est figé, les modes d'extraction proposent des paramètres variés. Les développeurs peuvent donc ajouter un nouveau mode d'extraction en implémentant l'interface \textit{ExtractMode} et ses méthodes :
\begin{itemize}
	\item{\textit{loadFromFile}} permet la lecture d'un fichier déjà existant et l'on devra implémenter les différents attributs qui peuvent être analysés par ce mode.
	\item{\textit{toConFile}} permet l'écriture de notre mode d'extraction dans le fichier de configuration final.
	\item{\textit{getHtmlContent}} gère l'affichage de notre mode et les différents liens entre les entrées web et nos attributs.
\end{itemize}

Enfin, il faut ajouter un nouvel objet de cette classe au sein de la méthode \textit{initListModel} de \textit{WizardAction}.

\section{Grabber}

Cette classe permet simplement de conserver et centraliser l'ensemble des paramètres génériques aux fichier de grabber, tout en offrant les méthodes de lecture et d'écriture appropriées. Ainsi, c'est lui qui gère le respect des règles pour la génération du document afin qu'il puisse être correctement utilisé par le moteur PRISME.

\section{Scripts bash}

\paragraph{Ajout Serveur}

L'interface propose à l'utilisateur le choix parmi les serveurs référencés dans nos base de données. Néanmoins, il est nécessaire à l'utilisateur de pouvoir rajouter une nouvelle IP cible et de la référencer. Pour assumer ce besoin, des scripts de connexion ssh et de vérification d'utilisateur ont été mis en place. Ils permettent ainsi d'assurer l'état de connexion entre notre serveur web et le serveur cible (le serveur web imitant ainsi le comportement nécessaire au serveur de grabber). Si une erreur survient, alors on essaye de créer l'utilisateur \textit{transfer} et procéder à l'échange des clef ssh. L'utilisateur est ainsi informé au fur et à mesure, et si cela échoue malgré tout alors il sera nécessaire de revenir à une méthode manuel pour faire cette configuration.

\paragraph{Visualisation fichier}
Pour montrer à l'utilisateur que son choix de cible est valide ou non, lors de l'affichage de la page 2 du \grabName, une textbox affiche le retour du script de récupération de lignes. Celui-ci va accéder aux fichiers souhaités et retourner les dix dernières lignes de celui-ci. Ceci permet de se rendre compte d'éventuels problèmes résiduels, mais aussi de visualiser les lignes qui seront travailler ultérieurement (certains modes d'extraction peuvent également en avoir l'utilité).


